﻿using RAP.Framework.Libary.DataSource.DataReader;
using RAP.Framework.Libary.Utils;
using RAP.Framework.Libary.Utils.Factory;
using RAP.Framework.Libary.Utils.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using static RAP.Framework.Libary.DataSource.ServiceUtils;

namespace RAP.Framework.Libary.DataSource
{
  /// <summary>
  /// IDataReaderParser解析器工厂对象，读取IDataReader对象的数据并解析数据的工厂对象
  /// </summary>
  public class DataParserFactory : FactoryBase<IDataReaderParser>
  {
    /// <summary>
    /// 
    /// </summary>
    public DataParserFactory( )
    {
      this.Initialize();
    }

    /// <summary>
    /// 
    /// </summary>
    public override void Initialize( )
    {
      //注册默认的指令解析对象
      this.Register( DataResultTypes.Dictionary, new DictionaryParser() );
      this.Register( DataResultTypes.Map, new DictionaryParser() );
      this.Register( DataResultTypes.DataTable, new DataTableParser() );
      this.Register( DataResultTypes.Json, new JSONStringParser() );
      this.Register( DataResultTypes.Table, new SimpleTableParser() );
      this.Register( DataResultTypes.Model, new DataModelParser() );
      this.Register( DataResultTypes.DynamicDictionary, new DynamicParser() );
      this.Register( DataResultTypes.KeyObject, new KeyObjectParser() );
    }

    /// <summary>
    /// 获取或设置数据解析对象，默认返回键值对解析对象
    /// </summary>
    /// <param name="key"></param>
    /// <returns></returns>
    public override IDataReaderParser this[ string key ]
    {
      get
      {
        var parser = base[ key ];

        //如果按指定key未找到对应的数据解析器，则按完全限定名获取数据解析器
        if ( parser == null )
        {
          //如果类型名称中存在逗号，则代表指定类型的完全名称
          if ( key.LastIndexOf( ',' ) > 0 )
          {
            var type = Type.GetType( key );
            if ( type == null )
            {
              throw new Exception( $"未找到指定名称（{key}）的类型！" );
            }
          }

          //如果key不是完全限定名，则返回默认的实体类型数据解析器
          return this[ DataResultTypes.Model ];
        }
        return parser;
      }
      set
      {
        base[ key ] = value;
      }
    }
  }
}
